package com.zenithmind.coding.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zenithmind.coding.pojo.entity.Problem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 问题收藏Mapper接口 - 遵循接口隔离原则，专门处理问题收藏相关的数据访问
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface ProblemFavoriteMapper {

    /**
     * 收藏问题
     * 
     * @param problemId 问题ID
     * @param userId 用户ID
     * @return 插入行数
     */
    int insertFavorite(@Param("problemId") String problemId,
                      @Param("userId") String userId);

    /**
     * 取消收藏问题
     * 
     * @param problemId 问题ID
     * @param userId 用户ID
     * @return 删除行数
     */
    int deleteFavorite(@Param("problemId") String problemId,
                      @Param("userId") String userId);

    /**
     * 检查收藏状态
     * 
     * @param problemId 问题ID
     * @param userId 用户ID
     * @return 收藏记录数
     */
    int checkFavoriteStatus(@Param("problemId") String problemId,
                           @Param("userId") String userId);

    /**
     * 获取用户收藏的问题
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 问题列表
     */
    List<Problem> selectUserFavoriteProblems(@Param("userId") String userId,
                                            @Param("limit") Integer limit);

    /**
     * 批量收藏问题
     * 
     * @param problemIds 问题ID列表
     * @param userId 用户ID
     * @return 插入行数
     */
    int batchInsertFavorites(@Param("problemIds") List<String> problemIds,
                            @Param("userId") String userId);

    /**
     * 批量取消收藏
     * 
     * @param problemIds 问题ID列表
     * @param userId 用户ID
     * @return 删除行数
     */
    int batchDeleteFavorites(@Param("problemIds") List<String> problemIds,
                            @Param("userId") String userId);

    /**
     * 获取用户收藏统计
     * 
     * @param userId 用户ID
     * @return 收藏统计
     */
    Object selectUserFavoriteStatistics(@Param("userId") String userId);

    /**
     * 获取用户收藏分类统计
     * 
     * @param userId 用户ID
     * @return 分类统计
     */
    List<Object> selectUserFavoriteCategories(@Param("userId") String userId);

    /**
     * 获取用户收藏难度分布
     * 
     * @param userId 用户ID
     * @return 难度分布
     */
    List<Object> selectUserFavoriteDifficultyDistribution(@Param("userId") String userId);

    /**
     * 搜索用户收藏的问题
     * 
     * @param userId 用户ID
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 问题列表
     */
    List<Problem> searchUserFavoriteProblems(@Param("userId") String userId,
                                            @Param("keyword") String keyword,
                                            @Param("limit") Integer limit);

    /**
     * 按标签筛选用户收藏
     * 
     * @param userId 用户ID
     * @param tags 标签列表
     * @param limit 限制数量
     * @return 问题列表
     */
    List<Problem> selectUserFavoritesByTags(@Param("userId") String userId,
                                           @Param("tags") List<String> tags,
                                           @Param("limit") Integer limit);

    /**
     * 按难度筛选用户收藏
     * 
     * @param userId 用户ID
     * @param difficulty 难度等级
     * @param limit 限制数量
     * @return 问题列表
     */
    List<Problem> selectUserFavoritesByDifficulty(@Param("userId") String userId,
                                                 @Param("difficulty") Integer difficulty,
                                                 @Param("limit") Integer limit);

    /**
     * 获取用户收藏的问题数量
     * 
     * @param userId 用户ID
     * @return 收藏数量
     */
    Long countUserFavorites(@Param("userId") String userId);

    /**
     * 获取问题被收藏次数
     * 
     * @param problemId 问题ID
     * @return 收藏次数
     */
    Long countProblemFavorites(@Param("problemId") String problemId);

    /**
     * 获取最近收藏的问题
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 问题列表
     */
    List<Problem> selectRecentFavoriteProblems(@Param("userId") String userId,
                                              @Param("limit") Integer limit);

    /**
     * 清理过期收藏记录
     * 
     * @param days 天数
     * @return 删除行数
     */
    int cleanExpiredFavorites(@Param("days") Integer days);
}
